package filter

import (
	"fmt"
	"github.com/beego/beego/v2/server/web/context"
	"kong-social-api/commons/global"
	"kong-social-api/modules/login/model/dto"
	"kong-social-api/utils"
	"kong-social-api/utils/rdb"
	"strings"
)

func TokenFilter(ctx *context.Context) {
	// 如果是登录接口，/api/v1/xxx就直接进入loginfilter去校验。
	contains := strings.Contains(ctx.Request.RequestURI, "v1")
	// 如果接口中包括的是v1就直接反行，去执行loginfilter
	if !contains {
		global.SugarLog.Infof("1: 拦截器 %s 进来了...", "TokenFilter")
		// 如果在登录的情况，获取登录的token
		Token := ctx.Request.Header["Authorization"]
		// 如果你确实在前端登录了len(Token) 。并且len(Token[0])也不是""
		if len(Token) > 0 && len(Token[0]) > 0 {
			userLoginUuid := Token[0]
			// 如果用户还在登录中就开始使用UUID到缓存中获取用户信息
			cacheLoginKey := fmt.Sprintf("LOGIN:USER:%s", userLoginUuid)
			cacheUser, _ := rdb.RdbHGet(cacheLoginKey, "user")
			if cacheUser != nil {
				userDto := dto.UserDto{}
				utils.JsonToStruct(cacheUser.(string), &userDto)
				// 如果没有。就获取用户信息，下放到路由处理方法中，这样给后续需要用户信息的地方可以直接获取
				ctx.Input.SetData("uuid", userLoginUuid)
				ctx.Input.SetData("userId", userDto.ID)
				ctx.Input.SetData("userName", userDto.UserName)
				ctx.Input.SetData("avatar", userDto.Avatar)
			}
		}
	}
}
